// Copyright (c) 2025 Ilya Fedorov
// SPDX-License-Identifier: MIT
// https://github.com/iljyxa/SharedQueryDesignerHRM

#Область ОписаниеПеременных

&НаСервере
Перем ОбработкаОбъект; // ВнешняяОбработка.КонструкторПредставленийЗарплатаКадры

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Обработка = ОбработкаОбъект();
	ПолноеИмяОбработки = Обработка.Метаданные().ПолноеИмя();
	ОписаниеТипаВсеТипыПараметраПредставления = Обработка.ОписаниеТипаВсеТипыПараметраПредставления();
	
	ИнициализироватьОписанияПредставлений(Истина);

	Элементы.ПараметрыВидСравнения.РежимВыбораИзСписка = Истина;
	Для Каждого КлючИЗначение Из ДоступныеВидыСравненияОтбора() Цикл
		//@skip-check typed-value-adding-to-untyped-collection
		Элементы.ПараметрыВидСравнения.СписокВыбора.Добавить(КлючИЗначение.Ключ);
	КонецЦикла;

	ЗаполнитьСписокВыбораИсточникаДанных();
	
	// + УИ
	Элементы.ФормаСтраницаПроекта.Видимость = Ложь;
	// - УИ
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
		
	РедактированиеТекстаПредставления = Ложь;
	ИдентификаторСтрокиПредставления = Неопределено;
	Если Не ПустаяСтрока(Параметры.ТекстЗапроса) Тогда
		РедактированиеТекстаПредставления = Истина;

		РезультатПомещения = ТекстЗапросаПредставленияВДанныеФормы(Параметры.ТекстЗапроса);
		Если Не РезультатПомещения.Успех Тогда
			ТекстПредупреждения = СтрШаблон("Не удалось разобрать текст запроса: %1", РезультатПомещения.ТекстОшибки);
			ПоказатьПредупреждение(Неопределено, ТекстПредупреждения, , "Ошибка при разборе текста запроса");
		Иначе
			ИдентификаторСтрокиПредставления = РезультатПомещения.ИдентификаторСтрокиПредставления;
			Элементы.Представления.ТекущаяСтрока = РезультатПомещения.ИдентификаторСтрокиПредставления;
		КонецЕсли;	
	КонецЕсли;
	
	Если ВладелецФормы <> Неопределено Тогда
		Если РедактированиеТекстаПредставления Тогда
			УстановитьРежимИзменения(ЭтотОбъект, ИдентификаторСтрокиПредставления);
		Иначе
			УстановитьРежимВставки(ЭтотОбъект);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПредставления

&НаКлиенте
Процедура ПредставленияПриАктивизацииСтроки(Элемент)

	ОтключитьОбработчикОжидания("ПредставленияПослеАктивизацииСтроки");
	ПодключитьОбработчикОжидания("ПредставленияПослеАктивизацииСтроки", 0.1, Истина);

КонецПроцедуры

//@skip-check module-structure-form-event-regions
&НаКлиенте
Процедура ПредставленияПослеАктивизацииСтроки()
	
	// TODO: Перенести на сервер.
	Представление = Элементы.Представления.ТекущиеДанные;

	Если Представление = Неопределено Тогда
		ИдентификаторПредставления = Неопределено;
		Элементы.ГруппаПравая.Доступность = Ложь;
		ДоступныеЛевыеЗначенияОтбора.Очистить();
	Иначе
		ИдентификаторПредставления = Представление.ИдентификаторПредставления;
		Элементы.ГруппаПравая.Доступность = Истина;
		Элементы.ПредставленияИсточникДанных.Видимость = Представление.ЕстьИсточникДанных;
		Элементы.ПредставленияФильтр.Видимость = Представление.ЕстьФильтр;
		Элементы.ПредставленияФильтр.АвтоОтметкаНезаполненного = Представление.ФильтрОбязателен;
		Элементы.ПредставленияФильтр.ОтметкаНезаполненного = Представление.ФильтрОбязателен
															 И ПустаяСтрока(Представление.Фильтр);
		ДоступныеЛевыеЗначенияОтбора.ЗагрузитьЗначения(ДоступныеЛевыеЗначенияОтбора(ИдентификаторПредставления)); // Вызов сервера
	КонецЕсли;

	УстановитьОтборСтрок(Элементы.Поля, "ИдентификаторПредставления", ИдентификаторПредставления); // Вызов сервера
	УстановитьОтборСтрок(Элементы.Параметры, "ИдентификаторПредставления", ИдентификаторПредставления); // Вызов сервера

	УстановитьПодсказкуЗаполненияПолей();
КонецПроцедуры

//@skip-check module-structure-form-event-regions
&НаКлиенте
Процедура ПредставленияИсточникДанныхПриИзменении(Элемент)
	ПредставленияИсточникДанныхПриИзмененииНаСервере();
	УстановитьПодсказкуЗаполненияПолей();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПоля

&НаКлиенте
Процедура ПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если НоваяСтрока Тогда
		Элемент.ТекущиеДанные.ИдентификаторПредставления = Элементы.Представления.ТекущиеДанные.ИдентификаторПредставления;
		Элемент.ТекущиеДанные.Используется = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПоляПриИзменении(Элемент)
	Значения = ДоступныеЛевыеЗначенияОтбора(Элементы.Представления.ТекущиеДанные.ИдентификаторПредставления);
	ДоступныеЛевыеЗначенияОтбора.ЗагрузитьЗначения(Значения);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПараметры

&НаКлиенте
Процедура ПараметрыПриАктивизацииСтроки(Элемент)

	ТекущиеДанные = Элементы.Параметры.ТекущиеДанные;

	Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Отбор Тогда
		Элементы.ПараметрыИмя.КнопкаВыбора = Истина;
	Иначе
		Элементы.ПараметрыИмя.КнопкаВыбора = Неопределено;
	КонецЕсли;

	Если ТекущиеДанные <> Неопределено Тогда
		Элементы.ПараметрыЗначение.СписокВыбора.Очистить();

		Для Каждого ЭлементСписка Из ТекущиеДанные.СписокВыбора Цикл
			Элементы.ПараметрыЗначение.СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
		КонецЦикла;

		Элементы.ПараметрыЗначение.РежимВыбораИзСписка = Элементы.ПараметрыЗначение.СписокВыбора.Количество() > 0;
	КонецЕсли;

	УстановитьСвойстваЭлементаЗначенияПараметра();

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если НоваяСтрока Тогда
		Представление = Элементы.Представления.ТекущиеДанные;
		Элемент.ТекущиеДанные.Отбор = Представление.ДоступныОтборы;
		Элемент.ТекущиеДанные.ИдентификаторПредставления = Представление.ИдентификаторПредставления;
		Элемент.ТекущиеДанные.Используется = Истина;
		Элемент.ТекущиеДанные.ЗначениеЭтоВыражение = Истина;
		
		УстановитьСвойстваЭлементаЗначенияПараметра();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗначениеЭтоВыражениеПриИзменении(Элемент)
	УстановитьСвойстваЭлементаЗначенияПараметра();
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыИмяАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)

	Если Элементы.Параметры.ТекущиеДанные.Отбор Тогда
		СтандартнаяОбработка = Ложь;

		ДанныеВыбора = Новый СписокЗначений;

		Для Каждого ЭлементСписка Из ДоступныеЛевыеЗначенияОтбора Цикл
			Если СтрНайти(ВРег(ЭлементСписка.Значение), ВРег(Текст)) > 0 Тогда
				ДанныеВыбора.Добавить(ЭлементСписка.Значение);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыИмяНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)

	Если Элементы.Параметры.ТекущиеДанные.Отбор Тогда
		СтандартнаяОбработка = Ложь;
		ДанныеВыбора = ДоступныеЛевыеЗначенияОтбора;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗначениеПриИзменении(Элемент)
	Элементы.Параметры.ТекущиеДанные.Используется = Истина;
	УстановитьСвойстваЭлементаЗначенияПараметра();
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗначениеОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Элементы.Параметры.ТекущиеДанные.Значение = Неопределено;
	УстановитьСвойстваЭлементаЗначенияПараметра();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ПоказатьТекстЗапроса(Команда)
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ТекстЗапросаПредставления", СформироватьТекстЗапросаНаСервере());
	ОткрытьФорму(ПолноеИмяОбработки + ".Форма.ТекстЗапроса", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ВставитьТекстЗапросаПредставления(Команда)
	ТекстЗапроса = СформироватьТекстЗапросаНаСервере();
	Закрыть(ТекстЗапроса);
КонецПроцедуры

&НаКлиенте
Процедура ТолькоИспользуемые(Команда)

	ОтображатьТолькоИспользуемыеПоляИПараметры = Не ОтображатьТолькоИспользуемыеПоляИПараметры;

	Элементы.ПоляТолькоИспользуемые.Пометка = ОтображатьТолькоИспользуемыеПоляИПараметры;
	Элементы.ПараметрыТолькоИспользуемые.Пометка = ОтображатьТолькоИспользуемыеПоляИПараметры;

	ИмяПоля = "Используется";
	Если ОтображатьТолькоИспользуемыеПоляИПараметры Тогда
		УстановитьОтборСтрок(Элементы.Поля, ИмяПоля, Истина);
		УстановитьОтборСтрок(Элементы.Параметры, ИмяПоля, Истина);
	Иначе
		УдалитьОтборСтрок(Элементы.Поля, ИмяПоля);
		УдалитьОтборСтрок(Элементы.Параметры, ИмяПоля);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьФлажкиПараметров(Команда)
	УстановитьСнятьФлажки(ПараметрыПредставлений.НайтиСтроки(Новый Структура(Элементы.Параметры.ОтборСтрок)), Истина);
КонецПроцедуры

&НаКлиенте
Процедура СнятьФлажкиПараметров(Команда)
	УстановитьСнятьФлажки(ПараметрыПредставлений.НайтиСтроки(Новый Структура(Элементы.Параметры.ОтборСтрок)), Ложь);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФлажкиПолей(Команда)
	УстановитьСнятьФлажки(ПоляПредставлений.НайтиСтроки(Новый Структура(Элементы.Поля.ОтборСтрок)), Истина);
КонецПроцедуры

&НаКлиенте
Процедура СнятьФлажкиПолей(Команда)
	УстановитьСнятьФлажки(ПоляПредставлений.НайтиСтроки(Новый Структура(Элементы.Поля.ОтборСтрок)), Ложь);
КонецПроцедуры

&НаКлиенте
Процедура СброситьТекущиеНастройки(Команда)
	ИнициализироватьОписанияПредставлений();
	//@skip-check invocation-form-event-handler
	ПредставленияПриАктивизацииСтроки(Элементы.Представления);
КонецПроцедуры

&НаКлиенте
Процедура СтраницаПроекта(Команда)
	ПерейтиПоНавигационнойСсылке("https://github.com/iljyxa/SharedQueryDesignerHRM");
КонецПроцедуры

&НаКлиенте
Процедура ИмпортПредставленияИзТекстаЗапроса(Команда)
	
	// Асинх не используется лдя совместимости с УИ
	ОписаниеОповещения = Новый ОписаниеОповещения("ВводТекстаЗапросаЗавершение" , ЭтотОбъект);
	ТекстПодсказки = "Вставьте текст запроса представления";
	ПоказатьВводСтроки(ОписаниеОповещения, "", ТекстПодсказки, , Истина);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура СохранитьОписанияПредставленийВХранилище(ОписанияПредставлений)
	Обработка = ОбработкаОбъект();
	
	СохраняемоеЗначение = Новый Структура;
	СохраняемоеЗначение.Вставить("ВерсияКонфигурации", Метаданные.Версия);
	СохраняемоеЗначение.Вставить("ОписанияПредставлений", ОписанияПредставлений);
	
	//@skip-check bsl-legacy-check-static-feature-access-for-unknown-left-part
	Обработка.МодульОбщегоНазначения().ХранилищеОбщихНастроекСохранить(КлючХранилищаНастроек(),
																	   "ОписанияПредставлений",
																	   СохраняемоеЗначение);
КонецПроцедуры

&НаСервере
Функция ОписанияПредставленийИзХранилища()

	Обработка = ОбработкаОбъект();
	МодульОбщегоНазначения = Обработка.МодульОбщегоНазначения();
	//@skip-check bsl-legacy-check-static-feature-access-for-unknown-left-part
	СохраненноеЗначение = МодульОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(КлючХранилищаНастроек(),
																				 "ОписанияПредставлений");
	
	ОписанияПредставлений = Неопределено;
	
	Если ТипЗнч(СохраненноеЗначение) = Тип("Структура")
		И СохраненноеЗначение.ВерсияКонфигурации = Метаданные.Версия Тогда
		
		ОписанияПредставлений = СохраненноеЗначение.ОписанияПредставлений;
	КонецЕсли;
	
	Возврат ОписанияПредставлений;

КонецФункции

&НаСервереБезКонтекста
Функция КлючХранилищаНастроек()
	Возврат "КонструкторПредставленийЗарплатаКадры";
КонецФункции

// Объект текущей обработки
// 
// Возвращаемое значение:
//  ВнешняяОбработка.КонструкторПредставленийЗарплатаКадры - Обработка объект
//
&НаСервере
Функция ОбработкаОбъект()
	
	Если ОбработкаОбъект = Неопределено Тогда
		ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	КонецЕсли;
	
	Возврат ОбработкаОбъект;
	
КонецФункции

&НаКлиенте
Процедура ВводТекстаЗапросаЗавершение(ТекстЗапроса, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
		РезультатПомещения = ТекстЗапросаПредставленияВДанныеФормы(ТекстЗапроса);
		Если Не РезультатПомещения.Успех Тогда
			ТекстПредупреждения = СтрШаблон("Не удалось разобрать текст запроса: %1", РезультатПомещения.ТекстОшибки);
			ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);
		Иначе
			Если Элементы.Представления.ТекущаяСтрока = РезультатПомещения.ИдентификаторСтрокиПредставления Тогда
				ПредставленияПослеАктивизацииСтроки();	
			КонецЕсли;
			
			Элементы.Представления.ТекущаяСтрока = РезультатПомещения.ИдентификаторСтрокиПредставления;	
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#Область РаботаСФормой

&НаКлиенте
Процедура УстановитьПодсказкуЗаполненияПолей()

	Представление = Элементы.Представления.ТекущиеДанные;

	Если Представление = Неопределено Тогда
		Элементы.ГруппаПодсказкаПолей.Видимость = Ложь;
	Иначе
		Элементы.ГруппаПодсказкаПолей.Видимость = Представление.ЕстьИсточникДанных
												  И ПустаяСтрока(Представление.ИсточникДанных);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьСвойстваЭлементаЗначенияПараметра()

	ТекущиеДанные = Элементы.Параметры.ТекущиеДанные;
	Элемент = Элементы.ПараметрыЗначение;

	Если ТекущиеДанные <> Неопределено Тогда
		Если ТекущиеДанные.ЗначениеЭтоВыражение Тогда
			Элемент.ОграничениеТипа = Новый ОписаниеТипов("Строка");
		ИначеЕсли ТекущиеДанные.ДоступныеТипы.Типы().Количество() = 0 Тогда
			Элемент.ОграничениеТипа = ОписаниеТипаВсеТипыПараметраПредставления;
		Иначе
			Элемент.ОграничениеТипа = ТекущиеДанные.ДоступныеТипы;
		КонецЕсли;

		Элемент.ВыбиратьТип = ТекущиеДанные.Значение = Неопределено;
		Элемент.КнопкаВыбора = Элемент.ВыбиратьТип И Элемент.ОграничениеТипа.Типы().Количество() > 1;
	Иначе
		Элемент.ОграничениеТипа = Новый ОписаниеТипов;
		Элемент.ВыбиратьТип = Истина;
		Элемент.КнопкаВыбора = Элемент.ВыбиратьТип;
	КонецЕсли;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьРежимВставки(Форма)

	Форма.Параметры.РежимВставки = Истина;
	Форма.Элементы.ФормаВставитьТекстЗапросаПредставления.Видимость = Истина;
	Форма.Элементы.ФормаВставитьТекстЗапросаПредставления.КнопкаПоУмолчанию = Истина;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьРежимИзменения(Форма, ИдентификаторСтрокиПредставления = Неопределено)
	
	Форма.Параметры.РежимИзменения = Истина;
	Форма.Элементы.ФормаВставитьТекстЗапросаПредставления.Видимость = Истина;
	Форма.Элементы.ФормаВставитьТекстЗапросаПредставления.Заголовок = "Изменить";
	Форма.Элементы.ФормаВставитьТекстЗапросаПредставления.КнопкаПоУмолчанию = Истина;
	
	Если ИдентификаторСтрокиПредставления <> Неопределено Тогда
		ДанныеСтроки = Форма.Представления.НайтиПоИдентификатору(ИдентификаторСтрокиПредставления);
		Форма.Заголовок = ДанныеСтроки.Имя + ": " + Форма.Заголовок;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОтборСтрок(ЭлементФормыТаблица, ИмяПоля, Значение)

	Если ТипЗнч(ЭлементФормыТаблица.ОтборСтрок) = Тип("ФиксированнаяСтруктура") Тогда
		ОтборСтрок = Новый Структура(ЭлементФормыТаблица.ОтборСтрок);
	Иначе
		ОтборСтрок = Новый Структура;
	КонецЕсли;

	ОтборСтрок.Вставить(ИмяПоля, Значение);

	ЭлементФормыТаблица.ОтборСтрок = Новый ФиксированнаяСтруктура(ОтборСтрок); // Вызов сервера

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УдалитьОтборСтрок(ЭлементФормыТаблица, ИмяПоля)

	Если ЭлементФормыТаблица.ОтборСтрок = Неопределено Или Не ЭлементФормыТаблица.ОтборСтрок.Свойство(ИмяПоля) Тогда

		Возврат;
	КонецЕсли;

	ОтборСтрок = Новый Структура(ЭлементФормыТаблица.ОтборСтрок);
	ОтборСтрок.Удалить(ИмяПоля);
	ЭлементФормыТаблица.ОтборСтрок = Новый ФиксированнаяСтруктура(ОтборСтрок);

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьСнятьФлажки(Таблица, Установить)

	Для Каждого СтрокаТаблицы Из Таблица Цикл
		СтрокаТаблицы.Используется = Установить;
	КонецЦикла;

КонецПроцедуры

// Производит заполнение всех доступных представлений с предварительной очисткой текущего состояния.
// Помещает описания представлений в кэш, в качестве которого использует хранилище настроек, с целью
// уменьшения времени повторного открытия формы.
//
// Параметры:
//   ЗаполнитьИзКэша - Булево - признак получения описания представлений из кэша.
//								Если описания не кэшировались ранее, то  

&НаСервере
Процедура ИнициализироватьОписанияПредставлений(Знач ЗаполнитьИзКэша = Истина)
	
	ИмяТекущегоПредставления = Неопределено;
	ТекущаяСтрока = Элементы.Представления.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		ИмяТекущегоПредставления = Представления.НайтиПоИдентификатору(ТекущаяСтрока).Имя;
	КонецЕсли;
	
	Представления.Очистить();
	ПоляПредставлений.Очистить();
	ПараметрыПредставлений.Очистить();
	
	Если ЗаполнитьИзКэша Тогда
		ОписанияПредставлений = ОписанияПредставленийИзХранилища();
	КонецЕсли;
	
	Если ОписанияПредставлений = Неопределено Тогда
		ОписанияПредставлений = ОбработкаОбъект().ОписанияПредставленийПоКонфигурации();
		СохранитьОписанияПредставленийВХранилище(ОписанияПредставлений);
	КонецЕсли;
	
	Для Каждого КлючИзначение Из ОписанияПредставлений Цикл
		Описание = КлючИЗначение.Значение;

		ИдентификаторПредставления = Новый УникальныйИдентификатор;

		Представление = Представления.Добавить();
		ЗаполнитьЗначенияСвойств(Представление, Описание);
		Представление.ИдентификаторПредставления = ИдентификаторПредставления;

		Описание.ДоступныеПараметры.Сортировать("Обязательный УБЫВ, Имя");

		Для Каждого ДоступныйПараметр Из Описание.ДоступныеПараметры Цикл
			Параметр = ПараметрыПредставлений.Добавить();
			ЗаполнитьЗначенияСвойств(Параметр, ДоступныйПараметр);
			Параметр.ИдентификаторПредставления = ИдентификаторПредставления;
			Параметр.Используется = ДоступныйПараметр.Обязательный;
			Параметр.СписокВыбора = ДоступныйПараметр.ДоступныеЗначения;
			Параметр.ДоступныеТипы = ДоступныйПараметр.Тип;
		КонецЦикла;

		Для Каждого ДоступноеПоле Из Описание.ДоступныеПоля Цикл
			Поле = ПоляПредставлений.Добавить();
			ЗаполнитьЗначенияСвойств(Поле, ДоступноеПоле);
			Поле.ИдентификаторПредставления = ИдентификаторПредставления;
		КонецЦикла;

	КонецЦикла;

	Представления.Сортировать("Имя");
	
	НайденныеСтроки = Представления.НайтиСтроки(Новый Структура("Имя", ИмяТекущегоПредставления));
	Если НайденныеСтроки.Количество() > 0 Тогда
		Элементы.Представления.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
	КонецЕсли;
	
КонецПроцедуры

// Заполняет список выбора источника данных периодическими регистрами.
// Регистры с префиксом "Удалить" игнорируются.
//
&НаСервере
Процедура ЗаполнитьСписокВыбораИсточникаДанных()

	СписокВыбора = Элементы.ПредставленияИсточникДанных.СписокВыбора;
	СписокВыбора.Очистить();
	КартинкаРегистрСведений = БиблиотекаКартинок.РегистрСведений;

	Для Каждого РегистрСведений Из Метаданные.РегистрыСведений Цикл
		Если РегистрСведений.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический
			 Или СтрНачинаетсяС(РегистрСведений.Имя, "Удалить") Тогда

			Продолжить;
		КонецЕсли;

		ЭлементСписка = СписокВыбора.Добавить();
		ЭлементСписка.Значение = РегистрСведений.Имя;
		ЭлементСписка.Представление = СтрШаблон("%1 (%2)", РегистрСведений.Представление(), РегистрСведений.Имя);
		ЭлементСписка.Картинка = КартинкаРегистрСведений;
	КонецЦикла;

	СписокВыбора.СортироватьПоПредставлению();

КонецПроцедуры

// Обрабатывает изменение источника данных представления на сервере.
// Заполняет доступные поля представления для текущего представления и источника данных.
//
&НаСервере
Процедура ПредставленияИсточникДанныхПриИзмененииНаСервере()

	Представление = Представления.НайтиПоИдентификатору(Элементы.Представления.ТекущаяСтрока);

	ПоляПредставления = ПоляПредставлений.НайтиСтроки(Новый Структура("ИдентификаторПредставления",
																	  Представление.ИдентификаторПредставления));

	Для Каждого Поле Из ПоляПредставления Цикл
		ПоляПредставлений.Удалить(Поле);
	КонецЦикла;

	ОбработкаОбъект = ОбработкаОбъект();

	Если ВРег(Представление.Имя) = ВРег("ТаблицаРегистра")
		 Или ВРег(Представление.Имя) = ВРег("СрезПоследних")
		 Или ВРег(Представление.Имя) = ВРег("СрезПервых") Тогда

		МодульОбщегоНазначения = ОбработкаОбъект.МодульОбщегоНазначения();
		//@skip-check bsl-legacy-check-static-feature-access-for-unknown-left-part
		МодульЗарплатаКадрыОбщиеНаборыДанных = МодульОбщегоНазначения.ОбщийМодуль("ЗарплатаКадрыОбщиеНаборыДанных");

		ИмяВТФильтра = "ВТФильтр";
		ОписаниеФильтра = МодульЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра(ИмяВТФильтра,
																									  "Период");

		Если ВРег(Представление.Имя) = ВРег("ТаблицаРегистра") Тогда
			Запрос = МодульЗарплатаКадрыОбщиеНаборыДанных.ЗапросВТИмяРегистра(Представление.ИсточникДанных,
																			  Истина,
																			  ОписаниеФильтра);
		ИначеЕсли ВРег(Представление.Имя) = ВРег("СрезПоследних") Тогда
			Запрос = МодульЗарплатаКадрыОбщиеНаборыДанных.ЗапросВТИмяРегистраСрез(Представление.ИсточникДанных,
																				  Истина,
																				  ОписаниеФильтра,
																				  ,
																				  Истина);
		Иначе
			Запрос = МодульЗарплатаКадрыОбщиеНаборыДанных.ЗапросВТИмяРегистраСрез(Представление.ИсточникДанных,
																				  Истина,
																				  ОписаниеФильтра,
																				  ,
																				  Ложь);
		КонецЕсли;

		ОписаниеПредставления = ОбработкаОбъект.НовоеОписаниеПредставления();
		ОбработкаОбъект.ПоляЗапросаВДоступныеПоляПредставления(Запрос.Текст, ОписаниеПредставления);

		Для Каждого ДоступноеПоле Из ОписаниеПредставления.ДоступныеПоля Цикл
			Поле = ПоляПредставлений.Добавить();
			ЗаполнитьЗначенияСвойств(Поле, ДоступноеПоле);
			Поле.ИдентификаторПредставления = Представление.ИдентификаторПредставления;
		КонецЦикла;
	КонецЕсли;

	ДоступныеЛевыеЗначенияОтбора.ЗагрузитьЗначения(ДоступныеЛевыеЗначенияОтбора(Представление.ИдентификаторПредставления));

КонецПроцедуры

// Формирует текст запроса для текущего (выбранного на форме) представления.
// Если не выборано, возвращает пустую строку.
//
// Возвращаемое значение:
//   Строка - сформированный текст запроса
&НаСервере
Функция СформироватьТекстЗапросаНаСервере()

	ТекущаяСтрокаПредставления = Элементы.Представления.ТекущаяСтрока;
	Если ТекущаяСтрокаПредставления = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	Представление = Представления.НайтиПоИдентификатору(ТекущаяСтрокаПредставления);
	ПараметрыОтбора = Новый Структура("Используется,ИдентификаторПредставления",
									  Истина,
									  Представление.ИдентификаторПредставления);
	ВыбранныеПоля = ПоляПредставлений.НайтиСтроки(ПараметрыОтбора);
	ВыбранныеПараметры = ПараметрыПредставлений.НайтиСтроки(ПараметрыОтбора);

	Возврат СформироватьТекстЗапросаПредставления(Представление, ВыбранныеПоля, ВыбранныеПараметры);

КонецФункции

// Возвращает доступные левые значения отбора для указанного представления.
//
// Параметры:
//   ИдентификаторПредставления - Число - Идентификатор представления, для которого необходимо 
//   									  получить доступные левые значения отбора
//
// Возвращаемое значение:
//   Массив Из Строка - Массив доступных левых значений отбора для указанного представления
&НаСервере
Функция ДоступныеЛевыеЗначенияОтбора(Знач ИдентификаторПредставления)

	ПараметрыОтбора = Новый Структура("ИдентификаторПредставления", ИдентификаторПредставления);

	Возврат ПоляПредставлений.Выгрузить(ПараметрыОтбора).ВыгрузитьКолонку("Имя");

КонецФункции

#КонецОбласти

#Область РаботаСЗапросом

// Формирует текст на языке запросов из описания представления
//
// Параметры:
//   ПараметрыПредставления - ДанныеФормыСтруктура - Параметры представления
//   ВыбранныеПоля - Массив Из ДанныеФормыСтруктура - Поля, выбранные для включения в представление
//   ВыбранныеПараметры - Массив Из ДанныеФормыСтруктура - Параметры, выбранные для использования в представлении
//
// Возвращаемое значение:
//   Строка - Сформированный текст запроса для представления
&НаСервереБезКонтекста
Функция СформироватьТекстЗапросаПредставления(Знач ПараметрыПредставления,
											  Знач ВыбранныеПоля,
											  Знач ВыбранныеПараметры)

	ШаблонЗапроса = "ВЫБРАТЬ
					|	%1
					|ПОМЕСТИТЬ Представления_%2%3%4
					|%5
					|%6";

	ПоляЗапроса = Новый Массив;
	ШаблонПоля = "%1 КАК %2";
	Для Каждого ВыбранноеПоле Из ВыбранныеПоля Цикл
		ПоляЗапроса.Добавить(СтрШаблон(ШаблонПоля, ВыбранноеПоле.Выражение, ВыбранноеПоле.Имя));
	КонецЦикла;
	
	ИсточникДанных = ?(Не ПустаяСтрока(ПараметрыПредставления.ИсточникДанных),
					   "_" + ПараметрыПредставления.ИсточникДанных,
					   "");
					   
	Уточнение = ?(Не ПустаяСтрока(ПараметрыПредставления.Уточнение),
				  "_" + ПараметрыПредставления.Уточнение,
				  "");
	
	ТекстИз = "";
	Если Не ПустаяСтрока(ПараметрыПредставления.Фильтр) Тогда
		ТекстИз = "ИЗ
				  |	" + ПараметрыПредставления.Фильтр + " КАК " + ПараметрыПредставления.Фильтр;
	КонецЕсли;

	ОтборыЗапроса = Новый Массив;
	НомерОтбора = 1;
	Для Каждого ВыбранныйПараметр Из ВыбранныеПараметры Цикл
		Если ВыбранныйПараметр.Отбор Тогда
			РазделительПараметров = Формат(НомерОтбора, "ЧГ=;");
			НомерОтбора = НомерОтбора + 1;
		Иначе
			РазделительПараметров = "";
		КонецЕсли;
		ОтборыЗапроса.Добавить(ВыбранныйПараметрВВыражениеЯзыкаЗапроса(ВыбранныйПараметр, РазделительПараметров));
	КонецЦикла;

	ТекстГДЕ = "";
	Если ОтборыЗапроса.Количество() > 0 Тогда
		ТекстГДЕ = "ГДЕ
				   |	" + СтрСоединить(ОтборыЗапроса, Символы.ПС + Символы.Таб + "И ");
	КонецЕсли;
	
	Возврат СтрШаблон(ШаблонЗапроса,
							 СтрСоединить(ПоляЗапроса, "," + Символы.ПС + Символы.Таб),
							 ПараметрыПредставления.Имя,
							 ИсточникДанных,
							 Уточнение,
							 ТекстИз,
							 ТекстГДЕ);

КонецФункции

// Конвертирует параметр представления таблицы формы Параметры для текста запроса представления
// 
// Параметры:
//  ВыбранныйПараметр - ДанныеФормыЭлементКоллекции - Выбранный параметр таблицы ПараметрыПредставления
//  РазделительПараметров - Строка - Разделитель параметров. В случае указания нескольких отборов, они должны
//  								 быть разделены постфиксом. Иначе при разботе текста представления будет использоваться
//  								 только последний.
// 
// Возвращаемое значение:
//  Строка - Параметр на языке запроса
&НаСервереБезКонтекста
Функция ВыбранныйПараметрВВыражениеЯзыкаЗапроса(ВыбранныйПараметр, РазделительПараметров = "")
	
	Значение = ?(ВыбранныйПараметр.ЗначениеЭтоВыражение,
				 ВыбранныйПараметр.Значение,
				 ЗначениеПараметраВВыражениеЯзыкаЗапроса(ВыбранныйПараметр.Значение));
	
	Если ВыбранныйПараметр.Отбор Тогда
		// Необходимо преобразовать в 3 отдельных отбора ЛевоеЗначение, ВидСравнения, ПравоеЗначение
		ШаблонОтбора = """ЛевоеЗначение%1"" = ""%2""
					   |	И ""ВидСравнения%1"" = %3
					   |	И ""ПравоеЗначение%1"" = %4";
		
		Возврат СтрШаблон(ШаблонОтбора,
						  РазделительПараметров,
						  ВыбранныйПараметр.Имя,
						  ЗначениеПараметраВВыражениеЯзыкаЗапроса(ВыбранныйПараметр.ВидСравнения),
						  Значение);
	Иначе				 
		Возврат СтрШаблон("""%1"" = %2", ВыбранныйПараметр.Имя, Значение);
	КонецЕсли;

КонецФункции

// Конвертирует значение в выражение на языке запроса
// 
// Параметры:
//  Значение - Булево, Строка, Дата, Число, ВидСравненияКомпоновкиДанных - Значение
// 
// Возвращаемое значение:
//  Строка - Значение параметра в выражение языка запроса
&НаСервереБезКонтекста
Функция ЗначениеПараметраВВыражениеЯзыкаЗапроса(Значение)

	ТипЗначения = ТипЗнч(Значение);

	Если ТипЗначения = Тип("Дата") Тогда
		Возврат Формат(Значение, "ДФ='""ДАТАВРЕМЯ(""yyyy, MM, dd, HH, mm, ss"")""';");
	ИначеЕсли ТипЗначения = Тип("Число") Тогда
		Возврат Формат(Значение, "ЧРД=.; ЧН=; ЧГ=;");
	ИначеЕсли ТипЗначения = Тип("Булево") Тогда
		Возврат Формат(Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА;");
	ИначеЕсли ТипЗначения = Тип("ВидСравненияКомпоновкиДанных") Тогда
		СоответствиеВидовСравнений = ДоступныеВидыСравненияОтбора();

		ВыражениеЯзыкаЗапроса = СоответствиеВидовСравнений[Значение];
		Если ВыражениеЯзыкаЗапроса = Неопределено Тогда
			ВызватьИсключение "Недопустимый вид сравнения " + Значение;
		КонецЕсли;

		Возврат """" + ВыражениеЯзыкаЗапроса + """";
	КонецЕсли;

	Возврат """" + Строка(Значение) + """";

КонецФункции

// Соответствие ВидСравненияКомпоновкиДанных и строкового значения для текста запроса,
// доступные для представлений
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение:
//	 * Ключ - ВидСравненияКомпоновкиДанных - Вид сравнения
//	 * Значение - Строка - Вид сравнения для запроса
&НаКлиентеНаСервереБезКонтекста
Функция ДоступныеВидыСравненияОтбора()

	СоответствиеВидовСравнений = Новый Соответствие;
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.Больше, ">");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.Меньше, "<");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.Равно, "=");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.БольшеИлиРавно, ">=");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, ">=");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.ВИерархии, "В ИЕРАРХИИ");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.ВСписке, "В");
	СоответствиеВидовСравнений.Вставить(ВидСравненияКомпоновкиДанных.НеРавно, "<>");

	Возврат СоответствиеВидовСравнений;

КонецФункции

// Разбирает текст запроса представления и помещает в данные формы.
// Если представление с таким именем уже существует, то дополняет его.
// Иначе добавляет новое.
// 
// Параметры:
//  ТекстЗапроса - Строка - Текст запроса
// 
// Возвращаемое значение:
//  Структура - Текст запроса представления в данные формы:
// * Успех - Булево - Признак успешного разбора представления и помещения в данные формы
// * ТекстОшибки - Строка - Если Успех = Ложь, то содержит текст ошибки
// * ИдентификаторСтрокиПредставления - Неопределено, Число - Если Успех = Истина, то содержит идентификатор
//															  строки таблицы формы Представления, в которору было
//															  помещено представление.
// * ИдентификаторПредставления - Неопределено, УникальныйИдентификатор - Если Успех = Истина, то содержит идентификатор
//															  			  представления.
&НаСервере
Функция ТекстЗапросаПредставленияВДанныеФормы(Знач ТекстЗапроса)
	
	Результат = Новый Структура;
	Результат.Вставить("Успех", Истина);
	Результат.Вставить("ТекстОшибки", "");
	Результат.Вставить("ИдентификаторСтрокиПредставления", Неопределено);
	Результат.Вставить("ИдентификаторПредставления", Неопределено);
	
	РезультатРазбора = РазобратьТекстЗапросаПредставления(ТекстЗапроса);
	
	Если Не РезультатРазбора.Успех Тогда
		Результат.Успех = Ложь;
		Результат.ТекстОшибки = РезультатРазбора.ТекстОшибки;
		Возврат Результат;	
	КонецЕсли;
	
	Представление = НайтиПоИмени(Представления, РезультатРазбора.Имя);
	Если Представление = Неопределено Тогда
		Представление = Представления.Добавить();
		Представление.ИдентификаторПредставления = Новый УникальныйИдентификатор;
		Представление.Имя = РезультатРазбора.Имя;
	КонецЕсли;
	
	Представление.ИсточникДанных = РезультатРазбора.ИсточникДанных;
	Представление.Уточнение = РезультатРазбора.Уточнение;
	Представление.Фильтр = РезультатРазбора.Фильтр;
	Представление.ЕстьИсточникДанных = Не ПустаяСтрока(Представление.ИсточникДанных);
	Представление.ЕстьФильтр = Не ПустаяСтрока(Представление.Фильтр);
	
	Результат.ИдентификаторСтрокиПредставления = Представление.ПолучитьИдентификатор();
	Результат.ИдентификаторПредставления = Представление.ИдентификаторПредставления;
	
	ПараметрыОтбора = Новый Структура("ИдентификаторПредставления", Представление.ИдентификаторПредставления);
	ПоляТекущегоПредставления = ПоляПредставлений.НайтиСтроки(ПараметрыОтбора);
	Для Каждого ПолеПредставления Из ПоляТекущегоПредставления Цикл
		ПолеПредставления.Используется = Ложь;
	КонецЦикла;
	
	Для Каждого КлючИЗначение Из РезультатРазбора.Поля Цикл
		ИмяПоля = КлючИЗначение.Ключ;
		ВыражениеПоля = КлючИЗначение.Значение;

		ПолеПредставления = НайтиПоИмени(ПоляТекущегоПредставления, ИмяПоля);
		Если ПолеПредставления = Неопределено Тогда
			ПолеПредставления = ПоляПредставлений.Добавить();
			ПолеПредставления.ИдентификаторПредставления = Представление.ИдентификаторПредставления;
			ПолеПредставления.Имя = ИмяПоля;
		КонецЕсли;

		ПолеПредставления.Используется = Истина;
		ПолеПредставления.Выражение = ВыражениеПоля;
	КонецЦикла;
	
	ПараметрыТекущегоПредставления = ПараметрыПредставлений.НайтиСтроки(ПараметрыОтбора);
	Для Каждого ПараметрПредставления Из ПараметрыТекущегоПредставления Цикл
		ПараметрПредставления.Используется = Ложь;
	КонецЦикла;
	
	Для Каждого КлючИЗначение Из РезультатРазбора.Параметры Цикл
		ИмяПараметра = КлючИЗначение.Ключ;
		ЗначениеПараметра = КлючИЗначение.Значение;

		ПараметрПредставления = НайтиПоИмени(ПараметрыТекущегоПредставления, ИмяПараметра);
		Если ПараметрПредставления = Неопределено Тогда
			ПараметрПредставления = ПараметрыПредставлений.Добавить();
			ПараметрПредставления.ИдентификаторПредставления = Представление.ИдентификаторПредставления;
			ПараметрПредставления.Имя = ИмяПараметра;
		КонецЕсли;

		ПараметрПредставления.Используется = Истина;
		ПараметрПредставления.Значение = ЗначениеПараметра;
		// Базовая проверка. Функция ПараметрыЗапроса удаляет кавычки. При необходимости разработать
		// аналогичную функцию.
		ПараметрПредставления.ЗначениеЭтоВыражение = СтрНайти(ЗначениеПараметра, "&") > 0;
	КонецЦикла;

	ДоступныеВидыСравненияОтбора = ДоступныеВидыСравненияОтбора();
	СоответствиеВидовСравнения = Новый Соответствие;
	Для Каждого КлючИЗначение Из ДоступныеВидыСравненияОтбора Цикл
		СоответствиеВидовСравнения.Вставить(КлючИЗначение.Значение, КлючИЗначение.Ключ);
	КонецЦикла;

	Для Каждого ОписаниеОтбора Из РезультатРазбора.Отборы Цикл
		ПараметрПредставления = НайтиПоИмени(ПараметрыТекущегоПредставления, ОписаниеОтбора.ЛевоеЗначение);
		Если ПараметрПредставления = Неопределено Тогда
			ПараметрПредставления = ПараметрыПредставлений.Добавить();
			ПараметрПредставления.ИдентификаторПредставления = Представление.ИдентификаторПредставления;
			ПараметрПредставления.Имя = ОписаниеОтбора.ЛевоеЗначение;	
		КонецЕсли;
		
		ПараметрПредставления.Используется = Истина;
		ПараметрПредставления.Отбор = Истина;
		ПараметрПредставления.ВидСравнения = СоответствиеВидовСравнения[ОписаниеОтбора.ВидСравнения];
		ПараметрПредставления.Значение = ОписаниеОтбора.ПравоеЗначение;
		// Базовая проверка. Функция КоллекцияОтборПоПараметрам удаляет кавычки. При необходимости разработать
		// аналогичную функцию.
		ПараметрПредставления.ЗначениеЭтоВыражение = СтрНайти(ЗначениеПараметра, "&") > 0;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// Разбирает на составные части текст запроса представления
// 
// Параметры:
//  ТекстЗапроса - Строка - Текст запроса
// 
// Возвращаемое значение:
//  Структура - Разобрать текст запроса представления:
// * Успех - Булево - Ложь, если произошла ошибка
// * ТекстОшибки - Строка - Если Успех = Ложь, то содержит текст ошибки
// * Имя - Строка - Имя представления
// * ИсточникДанных - Строка - Источник данных представления
// * Фильтр - Строка - Фильтр представления
// * Уточнение - Строка - Уточнение представления
// * Поля - Структура - Поля представления:
// 	** Ключ - Строка - Имя поля
// 	** Значение - Строка - Выражение поля
// * Параметры - Структура - Параметры представления без отборов:
// 	** Ключ - Строка - Имя параметра
// 	** Значение - Строка - Значение параметра
// * Отборы - Массив Из Структура  - Отборы представления:
//	** ЛевоеЗначение - Строка - Левое значение
//	** ВидСравнения - Строка - Вид сравнения
//	** ПравоеЗначение - Строка - Правое значение
&НаСервере
Функция РазобратьТекстЗапросаПредставления(Знач ТекстЗапроса)
	
	Результат = Новый Структура;
	Результат.Вставить("Успех", Истина);
	Результат.Вставить("ТекстОшибки", "");
	Результат.Вставить("Имя", "");
	Результат.Вставить("ИсточникДанных", "");
	Результат.Вставить("Фильтр", "");
	Результат.Вставить("Уточнение", "");
	Результат.Вставить("Поля", Новый Структура);
	Результат.Вставить("Параметры", Новый Структура);
	Результат.Вставить("Отборы", Новый Массив);
	
	Если ПустаяСтрока(ТекстЗапроса) Тогда
		Результат.Успех = Ложь;
		Результат.ТекстОшибки = "Пустой текст запроса";
		
		Возврат Результат;
	КонецЕсли;
	
	ТекстЗапроса = СокрЛП(ТекстЗапроса);
	Если СтрНайти(ТекстЗапроса, "|") > 0 Тогда
		ТекстЗапроса = ОбработкаОбъект().ТекстЗапросаИзСтрокКода(ТекстЗапроса);
	КонецЕсли;
	
	МодульОбщегоНазначения = ОбработкаОбъект().МодульОбщегоНазначения();
	//@skip-check bsl-legacy-check-static-feature-access-for-unknown-left-part
	МодульЗарплатаКадрыОбщиеНаборыДанных = МодульОбщегоНазначения.ОбщийМодуль("ЗарплатаКадрыОбщиеНаборыДанных");

	КлючевоеСловоПоместить = "ПОМЕСТИТЬ";
	ПозицияСловаПоместить = СтрНайти(ВРег(ТекстЗапроса), КлючевоеСловоПоместить + " ");

	Если ПозицияСловаПоместить = 0 Тогда
		Результат.Успех = Ложь;
		Результат.ТекстОшибки =
			"В тексте запроса не найдено ключевое слово ПОМЕСТИТЬ.
			|Ожидалось полное имя представления вида ПОМЕСТИТЬ Представления_ИмяПредставления.";
		
		Возврат Результат;
	КонецЕсли;
	
	НачальнаяПозиция = ПозицияСловаПоместить + СтрДлина(КлючевоеСловоПоместить + " ");
	ПолноеИмяПредставления = МодульЗарплатаКадрыОбщиеНаборыДанных.ПервоеСловоНачинаяСПозицииВТексте(ТекстЗапроса,
																									НачальнаяПозиция);
	ПолноеИмяПредставления = СокрЛП(ПолноеИмяПредставления);
	ЧастиПолногоИмениПредставления = РазобратьПолноеИмяПредставления(ПолноеИмяПредставления);

	Если ПустаяСтрока(ЧастиПолногоИмениПредставления.Имя) Тогда
		Результат.Успех = Ложь;
		Результат.ТекстОшибки = СтрШаблон(
			"Неверное имя таблицы представления %1. Ожидалось имя вида Представления_ИмяПредставления.",
			ПолноеИмяПредставления);
		
		Возврат Результат;
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(Результат, ЧастиПолногоИмениПредставления);
	
	МассивИменВТИсточниковПараметров = МодульЗарплатаКадрыОбщиеНаборыДанных.МассивИменВТИсточниковПараметров(ТекстЗапроса,
																											 ПолноеИмяПредставления);
	Если МассивИменВТИсточниковПараметров.Количество() > 0 Тогда
		Результат.Фильтр = МассивИменВТИсточниковПараметров[0];
	КонецЕсли;

	Результат.Поля = МодульЗарплатаКадрыОбщиеНаборыДанных.ПоляЗапроса(Лев(ТекстЗапроса, ПозицияСловаПоместить - 1));
	Результат.Параметры = МодульЗарплатаКадрыОбщиеНаборыДанных.ПараметрыЗапроса(ТекстЗапроса, ПолноеИмяПредставления);
	Результат.Отборы = МодульЗарплатаКадрыОбщиеНаборыДанных.КоллекцияОтборПоПараметрам(Результат.Параметры);
	
	УдаляемыеПараметры = Новый Массив;
	Для Каждого КлючИЗначение Из Результат.Параметры Цикл
		ИмяПараметра = КлючИЗначение.Ключ;
		Если СтрНачинаетсяС(ВРег(ИмяПараметра), ВРег("ЛевоеЗначение"))
			 Или СтрНачинаетсяС(ВРег(ИмяПараметра), ВРег("ВидСравнения"))
			 Или СтрНачинаетсяС(ВРег(ИмяПараметра), ВРег("ПравоеЗначение")) Тогда

			УдаляемыеПараметры.Добавить(ИмяПараметра);
		КонецЕсли;	
	КонецЦикла;
	
	Для Каждого ИмяПараметра Из УдаляемыеПараметры Цикл
		Результат.Параметры.Удалить(ИмяПараметра);	
	КонецЦикла;
	
	Если Результат.Отборы = Неопределено Тогда
		Результат.Отборы = Новый Массив;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Разбирает на составные части полное имя представления, которое указывается после ключевого
// слова ПОМЕСТИТЬ
// 
// Параметры:
//  ПолноеИмя - Строка - Полное имя представления вида Представления_ИмяПредставления_<...>
// 
// Возвращаемое значение:
//  Структура - Разобрать полное имя представления:
// * Имя - Строка - Имя. Пустое, если не удалось разобрать
// * ИсточникДанных - Строка - Источник данных
// * Уточнение - Строка - Постфикс
&НаСервере
Функция РазобратьПолноеИмяПредставления(ПолноеИмя)

	Результат = Новый Структура;
	Результат.Вставить("Имя", "");
	Результат.Вставить("ИсточникДанных", "");
	Результат.Вставить("Уточнение", "");

	Если ПустаяСтрока(ПолноеИмя) Тогда
		Возврат Результат;
	КонецЕсли;

	ЧастиПолногоИмени = СтрРазделить(ПолноеИмя, "_");
	
	Если ЧастиПолногоИмени.Количество() = 1 Тогда
		Если ВРег(ЧастиПолногоИмени[0]) <> ВРег("Представления") Тогда
			Результат.Имя = ЧастиПолногоИмени[0];
		КонецЕсли;

		Возврат Результат;
	КонецЕсли;

	Результат.Имя = ЧастиПолногоИмени[1];

	Если (ЭтоИмяПредставленияСИсточникомДанных(Результат.Имя)) И ЧастиПолногоИмени.Количество() > 3 Тогда
		ЗаполнитьЗначенияСвойств(Результат, РазобратьИмяПредставленияСИменемРегистра(ЧастиПолногоИмени));
	ИначеЕсли ЧастиПолногоИмени.Количество() >= 3 Тогда
		Результат.ИсточникДанных = ЧастиПолногоИмени[2];
		Если ЧастиПолногоИмени.Количество() > 3 Тогда
			МодульОбщегоНазначения = ОбработкаОбъект().МодульОбщегоНазначения();
			МодульОбщегоНазначенияБЗККлиентСервер = МодульОбщегоНазначения.ОбщийМодуль(
				"ОбщегоНазначенияБЗККлиентСервер");
			ЧастиУточнения = МодульОбщегоНазначенияБЗККлиентСервер.СрезМассива(ЧастиПолногоИмени, 3);
			Результат.Уточнение = СтрСоединить(ЧастиУточнения, "_");
		КонецЕсли;
	Иначе
		// Обработка не требуется
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Проверяет, соответствует ли имя источника данных одному из стандартных имен представлений.
//
// Параметры:
//   Имя - Строка - Имя источника данных для проверки.
//
// Возвращаемое значение:
//   Булево - Истина, если имя соответствует "ТаблицаРегистра", "СрезПервых" или "СрезПоследних", иначе Ложь
&НаСервереБезКонтекста
Функция ЭтоИмяПредставленияСИсточникомДанных(Имя)
	Возврат ВРег(Имя) = ВРег("ТаблицаРегистра")
		  Или ВРег(Имя) = ВРег("СрезПервых")
		  Или ВРег(Имя) = ВРег("СрезПоследних");
КонецФункции

// Разбирает имя представления с именем регистра на составные части.
//
// Параметры:
//   ЧастиПолногоИмени - Массив Из Строка - части полного имени представления, разбитые по символу "_".
//
// Возвращаемое значение:
//   Структура - содержит имя представления, источник данных и уточнение:
//	   * ИсточникДанных - Строка - источник данных.
//	   * Уточнение - Строка - уточнение.
//
&НаСервере
Функция РазобратьИмяПредставленияСИменемРегистра(ЧастиПолногоИмени)
	
	Результат = Новый Структура("ИсточникДанных, Уточнение", "", "", "");
	
	МодульОбщегоНазначения = ОбработкаОбъект().МодульОбщегоНазначения();
	МодульОбщегоНазначенияБЗККлиентСервер = МодульОбщегоНазначения.ОбщийМодуль("ОбщегоНазначенияБЗККлиентСервер");
	
	ИндексИмениРегистра = 2;
		
	// Представление может содержать в качестве источника данных регистр, который может иметь префиксацию с "_".
	// Также может содержать уточнение через "_". В таком случае необходим поиск по метаданным.
	Для Индекс = 0 По ЧастиПолногоИмени.ВГраница() - ИндексИмениРегистра Цикл
		ЧастиПроверяемогоИмени = МодульОбщегоНазначенияБЗККлиентСервер.СрезМассива(ЧастиПолногоИмени,
																				   ИндексИмениРегистра,
																				   ЧастиПолногоИмени.ВГраница()
																				   - Индекс);
		ПроверяемоеИмя = СтрСоединить(ЧастиПроверяемогоИмени, "_");
		Если Метаданные.РегистрыСведений.Найти(ПроверяемоеИмя) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Результат.ИсточникДанных = ПроверяемоеИмя;
		Если Индекс > 0 Тогда
			ЧастиУточнения = МодульОбщегоНазначенияБЗККлиентСервер.СрезМассива(ЧастиПолногоИмени,
																			   ЧастиПолногоИмени.ВГраница()
																			   - Индекс
																			   + 1);

			Результат.Уточнение = СтрСоединить(ЧастиУточнения, "_");
		КонецЕсли;

		Прервать;
	КонецЦикла;

	Если ПустаяСтрока(Результат.ИсточникДанных) Тогда
		ЧастиИсточникаДанных = МодульОбщегоНазначенияБЗККлиентСервер.СрезМассива(ЧастиПолногоИмени, ИндексИмениРегистра);
		Результат.ИсточникДанных = СтрСоединить(ЧастиИсточникаДанных, "_");
	КонецЕсли;
	
	Возврат Результат;
		
КонецФункции

// Выполняет регистронезависимый поиск по полю Имя в коллекции.
// Добавление отдельного поля для поиска не имеет смысла т.к. коллекции очень маленькие.
// 
// Параметры:
//  Коллекция - ДанныеФормыКоллекция, Массив из ДанныеФормыЭлементКоллекции - Коллекция
//  Значение - Строка - Значение
// 
// Возвращаемое значение:
//  Неопределено, ДанныеФормыЭлементКоллекции - Найти по имени
&НаКлиентеНаСервереБезКонтекста
Функция НайтиПоИмени(Коллекция, Значение)

	ЗначениеВРег = ВРег(Значение);

	НайденнаяСтрока = Неопределено;

	Для Каждого СтрокаКоллекции Из Коллекция Цикл
		Если ВРег(СтрокаКоллекции.Имя) = ЗначениеВРег Тогда
			НайденнаяСтрока = СтрокаКоллекции;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат НайденнаяСтрока;

КонецФункции

#КонецОбласти

#КонецОбласти